package test.反射;

import java.lang.reflect.Method;

/**
 * Created by chengxiaoqi1 on 2018/5/17.
 */
public class ReflectionMethod {
    public static void main(String[] args) {
        try {
            /**
             *
             * 1.获取成员方法调用：
             *
             * 1.批量：
             * 1.1 java.lang.Class#getMethods() 获取所有公有方法（包含负累的方法也包含 Object 类）
             * 1.2 java.lang.Class#getDeclaredMethods() 获取所有的成员方法，包括私有的 (不包括继承的)
             *
             * 2. 获取单个
             * 2.1 java.lang.Class#getMethod(java.lang.String, java.lang.Class[])
             * 2.2 java.lang.Class#getDeclaredMethods()
             *
             * 3.调用方法
             * java.lang.reflect.Method#invoke(java.lang.Object, java.lang.Object...)
             */
            Class stuClazz = Class.forName("entity.Student");
            System.out.println("-- 获取所有共有方法 --");
            Method[] methods = stuClazz.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }

            System.out.println("-- 取所有方法 包括私有的 --");
            methods = stuClazz.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method);
            }

            System.out.println("-- 获取公有的 show1 方法 --");
            Method m = stuClazz.getMethod("show1", String.class);
            System.out.println(m);
            Object obj = stuClazz.getConstructor().newInstance();
            m.invoke(obj, "刘德华");

            System.out.println("-- 获取私有的show4方法 --");
            m = stuClazz.getDeclaredMethod("show4", int.class);
            System.out.println(m);
            m.setAccessible(true);
            Object res = m.invoke(obj, 20);
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
